home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
netz
/
term
/
extras
/
source
/
gtlayout-source.lha
/
gtlayout_lib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-27
|
5KB
|
255 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1995 by Olaf `Olsen' Barthel
** Freely distributable.
*/
#include "gtlayout_global.h"
struct GTLayoutBase
{
struct Library LibNode;
struct ExecBase *ExecBase;
struct SignalSemaphore LockSemaphore;
BPTR LibSegment;
};
#ifdef __SASC
#define SysBase GTLayoutBase -> ExecBase
#endif // __SASC
struct Library * __saveds __asm LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase);
struct Library * __saveds __asm LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase);
BPTR __saveds __asm LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase);
BPTR __saveds __asm LibClose(register __a6 struct GTLayoutBase *GTLayoutBase);
LONG __saveds __asm LibNull(register __a6 struct GTLayoutBase *GTLayoutBase);
STATIC APTR LibVectors[] =
{
LibOpen,
LibClose,
LibExpunge,
LibNull,
LT_LevelWidth,
LT_DeleteHandle,
LT_CreateHandle,
LT_CreateHandleTagList,
LT_Rebuild,
LT_HandleInput,
LT_BeginRefresh,
LT_EndRefresh,
LT_GetAttributesA,
LT_SetAttributesA,
LT_AddA,
LT_NewA,
LT_EndGroup,
LT_LayoutA,
LT_LayoutMenusA,
#ifdef DO_FRACTION_KIND
LT_Fixed2String,
LT_String2Fixed,
LT_FixedMult,
#else
LibNull,
LibNull,
LibNull,
#endif // DO_FRACTION_KIND
LT_LabelWidth,
LT_LabelChars,
LT_LockWindow,
LT_UnlockWindow,
LT_DeleteWindowLock,
LT_ShowWindow,
LT_Activate,
LT_PressButton,
LT_GetCode,
LT_GetIMsg,
LT_ReplyIMsg,
LT_BuildA,
LT_RebuildTagList,
LT_UpdateStrings,
#ifdef DO_MENUS
LT_DisposeMenu,
LT_NewMenuTemplate,
LT_NewMenuTagList,
LT_MenuControlTagList,
LT_GetMenuItem,
LT_FindMenuCommand,
#else
LibNull,
LibNull,
LibNull,
LibNull,
LibNull,
LibNull,
#endif // DO_MENUS
LT_NewLevelWidth,
(APTR)-1
};
extern UBYTE __far LibName[],
LibID[];
extern LONG __far LibVersion,
LibRevision;
#ifdef __SASC
struct { ULONG DataSize; APTR Table; APTR Data; struct Library * (*Init)(); } __aligned LibInitTab =
{
sizeof(struct GTLayoutBase),
LibVectors,
NULL,
LibInit
};
#endif // __SASC
#ifdef _DCC
extern ULONG __stkargs __asm _AutoInit0(__a6 struct ExecBase *SysBase);
extern ULONG __stkargs __asm _AutoInit1(__a6 struct ExecBase *SysBase);
extern ULONG __stkargs __asm _AutoExit0(__a6 struct ExecBase *SysBase);
extern ULONG __stkargs __asm _AutoExit1(__a6 struct ExecBase *SysBase);
#endif // _DCC
struct Library * __saveds __asm
LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase)
{
#ifdef _DCC
struct ExecBase *SysBase;
#endif // _DCC
#ifdef CPU_ANY
if(ExecBase -> LibNode . lib_Version < 37)
return(NULL);
#else
if(ExecBase -> LibNode . lib_Version < 37 || !(ExecBase -> AttnFlags & AFF_68020))
return(NULL);
#endif // CPU_ANY
#ifdef _DCC
if(_AutoInit0(SysBase))
return(NULL);
if(_AutoInit1(SysBase))
return(NULL);
SysBase = ExecBase;
if(!(GTLayoutBase = (struct GTLayoutBase *)MakeLibrary((APTR)LibVectors,NULL,NULL,sizeof(struct GTLayoutBase),NULL)))
return(NULL);
#endif // _DCC
GTLayoutBase -> LibNode . lib_Node . ln_Type = NT_LIBRARY;
GTLayoutBase -> LibNode . lib_Node . ln_Name = LibName;
GTLayoutBase -> LibNode . lib_Flags = LIBF_CHANGED | LIBF_SUMUSED;
GTLayoutBase -> LibNode . lib_Version = LibVersion;
GTLayoutBase -> LibNode . lib_Revision = LibRevision;
GTLayoutBase -> LibNode . lib_IdString = (APTR)LibID;
GTLayoutBase -> LibSegment = Segment;
GTLayoutBase -> ExecBase = ExecBase;
InitSemaphore(>LayoutBase -> LockSemaphore);
return(GTLayoutBase);
}
struct Library * __saveds __asm
LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase)
{
#ifdef _DCC
struct ExecBase *SysBase = GTLayoutBase -> ExecBase;
#endif // _DCC
GTLayoutBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
GTLayoutBase -> LibNode . lib_OpenCnt++;
ObtainSemaphore(>LayoutBase -> LockSemaphore);
if(GTLayoutBase -> LibNode . lib_OpenCnt == 1)
{
if(!LT_Init())
{
LT_Exit();
GTLayoutBase -> LibNode . lib_OpenCnt--;
ReleaseSemaphore(>LayoutBase -> LockSemaphore);
return(NULL);
}
}
ReleaseSemaphore(>LayoutBase -> LockSemaphore);
return(GTLayoutBase);
}
BPTR __saveds __asm
LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase)
{
#ifdef _DCC
struct ExecBase *SysBase = GTLayoutBase -> ExecBase;
#endif // _DCC
if(!GTLayoutBase -> LibNode . lib_OpenCnt && GTLayoutBase -> LibSegment)
{
BPTR TempSegment = GTLayoutBase -> LibSegment;
Remove((struct Node *)GTLayoutBase);
FreeMem((BYTE *)GTLayoutBase - GTLayoutBase -> LibNode . lib_NegSize,GTLayoutBase -> LibNode . lib_NegSize + GTLayoutBase -> LibNode . lib_PosSize);
#ifdef _DCC
_AutoExit0(SysBase);
_AutoExit1(SysBase);
#endif // _DCC
return(TempSegment);
}
else
{
GTLayoutBase -> LibNode . lib_Flags |= LIBF_DELEXP;
return(NULL);
}
}
BPTR __saveds __asm
LibClose(register __a6 struct GTLayoutBase *GTLayoutBase)
{
#ifdef _DCC
struct ExecBase *SysBase = GTLayoutBase -> ExecBase;
#endif // _DCC
if(GTLayoutBase -> LibNode . lib_OpenCnt)
GTLayoutBase -> LibNode . lib_OpenCnt--;
if(!GTLayoutBase -> LibNode . lib_OpenCnt)
{
ObtainSemaphore(>LayoutBase -> LockSemaphore);
LT_Exit();
ReleaseSemaphore(>LayoutBase -> LockSemaphore);
if(GTLayoutBase -> LibNode . lib_Flags & LIBF_DELEXP)
return(LibExpunge(GTLayoutBase));
}
return(NULL);
}
LONG __saveds __asm
LibNull(register __a6 struct GTLayoutBase *GTLayoutBase)
{
return(NULL);
}